# -*- coding: utf-8 -*-
"""
bool() 函数的专用回调处理器

处理 bool 类型转换的不同场景：
1. 对于有 __bool__ 方法的类型，调用 __bool__()
2. 对于没有 __bool__ 方法的类型，使用默认转换
"""

from typing import Optional
from mcpy.ir.expressions.call import IRCall
from mcpy.codegen.core.context import CodeGenContext
from mcpy.codegen.core.emitter import EmitResult


class BoolFunctionCallback:
    """bool() 函数的回调处理器"""

    def emit(self, node: IRCall, context: CodeGenContext) -> Optional[EmitResult]:
        """生成 bool() 调用的代码

        Args:
            node: IRCall 节点
            context: 代码生成上下文

        Returns:
            EmitResult 或 None（如果不处理）
        """
        from mcpy.codegen.core.generator import get_global_generator

        generator = get_global_generator()

        # 确保有参数
        if not node.args or len(node.args) == 0:
            return None

        # 获取第一个参数
        arg = node.args[0]

        # 生成参数代码
        arg_code = generator.generate_expression(arg, context, parent_precedence=100)

        # 获取参数的推断类型
        arg_type_info = arg.get_extension_param("inferred_type")
        if not arg_type_info or not context.current_node:
            # 无法获取类型信息，使用默认转换
            return EmitResult(code=arg_code, precedence=2)

        # 查找 __bool__ 方法
        method_symbol = context.current_node.lookup_symbol(
            "__bool__",
            owner_type=arg_type_info,
            func_args=[],
        )

        if method_symbol:
            # 找到了 __bool__ 方法，获取匹配的签名
            matching_signature = method_symbol.find_matching_signature([arg_type_info])
            if not matching_signature and method_symbol.signatures:
                matching_signature = method_symbol.signatures[0]

            if matching_signature:
                # 获取模板
                template = matching_signature.emit_template
                if template:
                    # 应用模板生成代码
                    code = template.replace("{self}", arg_code)
                    return EmitResult(code=code, precedence=2)

        # 没有找到 __bool__ 方法或模板，使用默认转换
        # 默认情况下，直接使用参数本身（对于bool、int等基础类型）
        return EmitResult(code=arg_code, precedence=2)
